const { to, md5Password } = require("../utils");
const userService = require("../service/user.service");
const { NAME_OR_PASSWORD_IS_REQUIRED, NAME_IS_ALREADY_EXISTS, UNKNOWN_ERROR } = require("../config/error-constants");

// 将user信息存储到数据库
const verifyRegisterParams = async (ctx, next) => {
    // 1. 校验传过来的参数个数
    const { name, password } = ctx.request.body;
    if (!name || !password) {
        return ctx.app.emit("error", NAME_OR_PASSWORD_IS_REQUIRED, ctx);
    }

    // 2. 检查name字段在数据库中是否存在
    const [userListError, userList] = await to(userService.findUserByName(name));
    if (userListError) {
        return ctx.app.emit("error", UNKNOWN_ERROR, ctx);
    }
    if (userList.length > 0) {
        return ctx.app.emit("error", NAME_IS_ALREADY_EXISTS, ctx);
    }

    // 3.执行下一个中间件
    // 这里必须使用await 因为后续中间件存在异步操作，等待下一个中间件产生结果，否则在这里返回结果，压根不知道返回的什么结果
    await next();
};

// 加密中间件
const handlePassword = async (ctx, next) => {
    const { password } = ctx.request.body;
    if (password) {
        ctx.request.body.password = md5Password(password);
    }
    await next();
};

const verifyUpdateParams = async (ctx, next) => {
    // 传入参数情况
    // 1. name有值，password有值
    // 2. name有值，password无值
    // 3. name无值，password有值
    // 4. name无值，password无值
    const { name, password } = ctx.request.body;
    if (name === undefined && password === undefined) {
        return ctx.app.emit("error", NAME_OR_PASSWORD_IS_REQUIRED, ctx);
    }
    if (name) {
        const [error, resp] = await to(userService.findUserByName(name));
        if (error) {
            return ctx.app.emit("error", UNKNOWN_ERROR, ctx);
        }
        if (resp.length > 0) {
            return ctx.app.emit("error", NAME_IS_ALREADY_EXISTS, ctx);
        }
    }
    await next();
};

module.exports = {
    verifyRegisterParams,
    verifyUpdateParams,
    handlePassword,
};
